﻿using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using ContactManagement.AppCode.DynamicDataType;
using ContactManagement.AppCode.DynamicDataType.Creation;
using ContactManagement.Models;
using ContactManagement.Models.DynamicData;
using EFDataModel.DataCreation;
using Microsoft.Web.Helpers;

namespace ContactManagement
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
        }

        /// <summary>
        /// Registrieren von Routen
        /// </summary>
        /// <param name="routes"></param>
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //Route für die Anzeige der Kategorien in der Administration, Achtung die Reihenfolge der Routen sind wichtig.
            //http://weblogs.asp.net/scottgu/archive/2008/04/16/asp-net-mvc-source-refresh-preview.aspx
            routes.MapRoute(
                RouteNames.Categories.ToString(), // Route name
                "{controller}/Categories/{category}/{action}/{id}", // URL with parameter
                //{category} gibt an welche Kategorie bearbeitet werden soll, in der action Steht dann welche Aktion mit der Kategorie ausgeführt werden soll
                //die {id} wird nur verwendet wenn eine Kategorie bearbeitet werden soll.
                new { controller = EControllers.Administration.ToString(), id = UrlParameter.Optional } // Parameter defaults
            );

            //die Standardroute für alle Aufrufe mit Action und Controller
            routes.MapRoute(
                RouteNames.Default.ToString(), // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = EControllers.Home.ToString(), action = EActionHome.Index.ToString(), id = UrlParameter.Optional } // Parameter defaults
            );

        }

        /// <summary>
        /// wird beim Starten der Webanswnedung ausgeführt
        /// </summary>
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            //Zusätzliche ModelBinder registrieren
            AddModelBinder();

            FillLists fillLists = new FillLists(CurrentHttpContext.GetDataModel());
            fillLists.CreateListItems();
            CreateSampleData createSampleData = new CreateSampleData(CurrentHttpContext.GetDataModel());
            createSampleData.CreateData();

            //Initialisieren der Catpcha Keys, muss nur einmal Applikationsweit initialisiert werden, dann kann das Captcha problemlos erstellt werden.
            //http://midnightprogrammer.net/post/Working-With-Microsoft-Web-Helpers-In-MVC-3-Razor-View.aspx
            //http://ihatethissite.com/blog/2011/02/27/recaptcha-with-asp-net-mvc-razor-using-microsoft-web-helpers/
            ReCaptcha.PublicKey = WebConstants.PublicCaptchaKey;
            ReCaptcha.PrivateKey = WebConstants.PrivateCaptchaKey;
        }

        /// <summary>
        /// Zusätrzliche Modelbinder für die Webseite registrieren
        /// </summary>
        private void AddModelBinder()
        {
            //WICHTIG: Registrieren des Custom Modelbinders für unseren Datentyp EFDataType,
            //dafür muss jedes Model dem Modelbinder hinzugefügt werden wo unsere Auflistung von EFDataType vorkommt!
            ModelBinders.Binders.Add(typeof(EditUserAdminModel), new DynamicDataModelBinder());

            //Model Binden um beim Bearbeiten eines Dynamischen Datentyps den aktuellen Dynamischen Datentyp wieder zu laden
            ModelBinders.Binders.Add(typeof(EditModel), new EditModelDynamicDataModelBinder());
            ModelBinders.Binders.Add(typeof(EditModelList), new EditModelDynamicDataModelBinder());
        }

        /// <summary>
        /// Abfangen von Application Errors
        /// </summary>
        protected void Application_Error(object sender, EventArgs e)
        {
            //die Letzte Fehlermeldung ins Logifile schreiben
            EFDebugging.Debugging.WriteLog(@"\r\n ApplicationError:", Server.GetLastError());
            Response.Clear();
            //TODO wieder auskommentieren, wenn die Custom Fehlerseite angezeigt werden soll
            //Server.ClearError();

            //Auf den Error Controller verweisen und dort auf den Error View
            string path = Request.Path;
            Context.RewritePath(string.Format("/{0}/{0}", EControllers.Error.ToString()), false);
            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(Context);
            Context.RewritePath(path, false);
        }
    }
}